#!/bin/bash

# SunAdmin 脚手架一键发布脚本
# 用于发布 create-sunadmin 脚手架工具到 NPM

set -e

# 0. 先打包 template，如失败则终止
cd "$(dirname "$0")/template"
echo "🔨 尝试打包模板..."
if npm run build; then
  echo "✅ 模板打包成功"
else
  echo "❌ 模板打包失败，请检查报错信息！"
  exit 1
fi
cd ..

# 1. 展示脚手架工具信息
TOOL_PKG="$(dirname "$0")/package.json"
TEMPLATE_PKG="$(dirname "$0")/template/package.json"

TOOL_NAME=$(node -p "require('$TOOL_PKG').name")
TOOL_VERSION=$(node -p "require('$TOOL_PKG').version")
TOOL_DESC=$(node -p "require('$TOOL_PKG').description")

TEMPLATE_NAME=$(node -p "require('$TEMPLATE_PKG').name")
TEMPLATE_VERSION=$(node -p "require('$TEMPLATE_PKG').version")
TEMPLATE_DESC=$(node -p "require('$TEMPLATE_PKG').description")

# 0.1 自动递增版本号
NPM_LATEST_VERSION=$(npm view "$TOOL_NAME" version 2>/dev/null || echo "0.0.0")
LOCAL_VERSION=$(node -p "require('$TOOL_PKG').version")

# 递增 patch 版本
inc_patch() {
  local v=$1
  local major minor patch
  IFS='.' read -r major minor patch <<< "$v"
  patch=$((patch+1))
  echo "$major.$minor.$patch"
}

if [ "$NPM_LATEST_VERSION" = "0.0.0" ]; then
  NEXT_VERSION="$LOCAL_VERSION"
else
  if [ "$LOCAL_VERSION" = "$NPM_LATEST_VERSION" ]; then
    NEXT_VERSION=$(inc_patch "$NPM_LATEST_VERSION")
  elif [ "$(printf '%s\n' "$LOCAL_VERSION" "$NPM_LATEST_VERSION" | sort -V | tail -n1)" = "$NPM_LATEST_VERSION" ]; then
    # NPM 版本比本地新
    NEXT_VERSION=$(inc_patch "$NPM_LATEST_VERSION")
  else
    # 本地比 NPM 新
    NEXT_VERSION="$LOCAL_VERSION"
  fi
fi

# 交互确认/修改新版本号
echo "本地版本号: $LOCAL_VERSION"
echo "NPM 远程最新版本号: $NPM_LATEST_VERSION"
read -p "请输入本次发布的新版本号（直接回车将自动采用 NPM 递增版本: $NEXT_VERSION）: " INPUT_VERSION
if [ -n "$INPUT_VERSION" ]; then
  NEXT_VERSION="$INPUT_VERSION"
else
  echo "未输入，自动采用递增版本号: $NEXT_VERSION"
fi

# 写入 package.json
if [ "$NEXT_VERSION" != "$LOCAL_VERSION" ]; then
  echo "🔄 正在写入新版本号: $LOCAL_VERSION -> $NEXT_VERSION"
  TMPFILE=$(mktemp)
  jq --arg v "$NEXT_VERSION" '.version = $v' "$TOOL_PKG" > "$TMPFILE" && mv "$TMPFILE" "$TOOL_PKG"
  TMPFILE2=$(mktemp)
  jq --arg v "$NEXT_VERSION" '.version = $v' "$TEMPLATE_PKG" > "$TMPFILE2" && mv "$TMPFILE2" "$TEMPLATE_PKG"
  echo "✅ package.json 和 template/package.json 版本号已更新"
fi

# 重新加载变量
TOOL_VERSION=$(node -p "require('$TOOL_PKG').version")
TEMPLATE_VERSION=$(node -p "require('$TEMPLATE_PKG').version")

# 0. 自动同步版本号
if [ "$TOOL_VERSION" != "$TEMPLATE_VERSION" ]; then
  echo "🔄 正在同步模板版本号: $TEMPLATE_VERSION -> $TOOL_VERSION"
  TMPFILE=$(mktemp)
  jq --arg v "$TOOL_VERSION" '.version = $v' "$TEMPLATE_PKG" > "$TMPFILE" && mv "$TMPFILE" "$TEMPLATE_PKG"
  TEMPLATE_VERSION=$TOOL_VERSION
  echo "✅ 模板版本号已同步"
fi

# 展示信息
cat <<EOF
========================================
🛠️  脚手架工具信息：
  Name:        $TOOL_NAME
  Version:     $TOOL_VERSION
  Description: $TOOL_DESC

📦 模板项目信息：
  Name:        $TEMPLATE_NAME
  Version:     $TEMPLATE_VERSION
  Description: $TEMPLATE_DESC
========================================
EOF

# 1.5. 自动提交、打tag并推送
echo "💾 提交所有更改到git..."
git add .
echo "请输入本次发布的 commit message（如 feat: 新增xx/修复xx/发布v$TOOL_VERSION 等，直接回车则使用版本号）:"
read COMMIT_MSG
if [ -z "$COMMIT_MSG" ]; then
  COMMIT_MSG="release: v$TOOL_VERSION"
fi
git commit -m "$COMMIT_MSG" || echo "（无变更可提交）"
echo "🏷️ 打标签: v$TOOL_VERSION"
git tag -a "v$TOOL_VERSION" -m "$COMMIT_MSG" || echo "（标签已存在）"
echo "🚀 推送代码和标签到远程仓库..."
git push || true
git push --tags || true

# 2. 检查版本号是否一致
if [ "$TOOL_VERSION" != "$TEMPLATE_VERSION" ]; then
  echo "❌ 错误：脚手架工具版本号($TOOL_VERSION)与模板版本号($TEMPLATE_VERSION)不一致！"
  exit 1
fi

# 4. 检查 NPM 上的版本号
NPM_VERSION=$(npm view "$TOOL_NAME" version 2>/dev/null || echo "0.0.0")
echo "🌍 NPM 上当前版本: $NPM_VERSION"

# 5. 比较版本号
verlte() { [ "$1" = "$2" ] && return 0 || [  "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]; }
vergte() { [ "$1" = "$2" ] && return 0 || [  "$(printf '%s\n' "$1" "$2" | sort -V | tail -n1)" = "$1" ]; }

if [ "$TOOL_VERSION" = "$NPM_VERSION" ]; then
  echo "❌ 错误：NPM 上已存在相同版本号($NPM_VERSION)，请升级版本号后再发布。"
  exit 1
fi
if verlte "$TOOL_VERSION" "$NPM_VERSION"; then
  echo "❌ 错误：本地版本号($TOOL_VERSION) <= NPM 版本号($NPM_VERSION)，请升级版本号后再发布。"
  exit 1
fi

# 6. 检查 NPM 登录状态
if ! npm whoami > /dev/null 2>&1; then
  echo "❌ 错误：请先执行 npm login 登录 NPM 账户。"
  exit 1
fi
NPM_USER=$(npm whoami)
echo "🔐 当前 NPM 登录用户: $NPM_USER"

# 7. 发布确认
read -p "⚠️  确认要发布 $TOOL_NAME@$TOOL_VERSION 到 NPM 吗？(y/N): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
  echo "❌ 已取消发布"
  exit 0
fi

# 8. 执行发布
npm publish --access public
if [ $? -eq 0 ]; then
  echo "🎉 发布成功！"
  echo "🌍 https://www.npmjs.com/package/$TOOL_NAME"
else
  echo "❌ 发布失败，请检查错误信息！"
  exit 1
fi 